package com.urbanflow.vinci.parcourt;

import java.util.ArrayList;
import java.util.List;

import com.urbanflow.vinci.main.Arret;
import com.urbanflow.vinci.main.Horaire;
import com.urbanflow.vinci.main.Ligne;

public class Chemin {
	private Arret depart;
	private List<Arret> intermediaire = new ArrayList<Arret>();
	private Arret arrive;
	private Ligne moyen;
	private Chemin cheminPrecedent;
	private Chemin cheminSuivant;
	private Horaire lhoraire;
	private Graphe grapheArrive;
	private String id;
	private Integer poid = 0;
	
	
	
	public Integer getPoid() {
		return poid;
	}

	public void setPoid(Integer poid) {
		this.poid = poid;
	}

	public Chemin(Arret noeud, Graphe unGraphe, Horaire monHoraireArrive) {
		depart = noeud;
		grapheArrive = unGraphe;
		arrive = unGraphe.getNoeud();
		lhoraire = monHoraireArrive;
		StringBuffer idBuf = new StringBuffer();
		idBuf.append(noeud.getNomArret()).append("-").append(arrive.getNomArret());
		setId(idBuf.toString());
	}
	
	public List<Chemin> retournerCheminSuivant() {
		return  grapheArrive.getAllChemin(lhoraire.getDate(),this);
		//return  grapheArrive.getAllChemin(null,this);
	}
	
	public Arret getDepart() {
		return depart;
	}
	public void setDepart(Arret depart) {
		this.depart = depart;
	}
	public Arret getArrive() {
		return arrive;
	}
	public void setArrive(Arret arrive) {
		this.arrive = arrive;
	}
	public Ligne getMoyen() {
		return moyen;
	}
	public void setMoyen(Ligne moyen) {
		this.moyen = moyen;
	}
	public List<Arret> getIntermediaire() {
		return intermediaire;
	}
	public void setIntermediaire(List<Arret> intermediaire) {
		this.intermediaire = intermediaire;
	}
	public Chemin getCheminPrecedent() {
		return cheminPrecedent;
	}
	public void setCheminPrecedent(Chemin cheminPrecedent) {
		this.cheminPrecedent = cheminPrecedent;
		if(cheminPrecedent != null)
			poid = cheminPrecedent.getPoid() + 1 ;
	}
	public Horaire getLhoraire() {
		return lhoraire;
	}
	public void setLhoraire(Horaire lhoraire) {
		this.lhoraire = lhoraire;
	}
	public Graphe getGrapheArrive() {
		return grapheArrive;
	}
	public void setGrapheArrive(Graphe grapheArrive) {
		this.grapheArrive = grapheArrive;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Chemin congestionner() {
		if(cheminPrecedent != null) {
			if(cheminPrecedent.getMoyen() == this.getMoyen()) {
				intermediaire.add(this.depart); 
				this.depart  = cheminPrecedent.getDepart();
				this.lhoraire= cheminPrecedent.getLhoraire();
				cheminPrecedent = cheminPrecedent.getCheminPrecedent();			
				return this.congestionner();
			} else {
				cheminPrecedent.setCheminSuivant(this);
				return cheminPrecedent.congestionner();
			}	
		}
		
		return this;
	}

	public Chemin getCheminSuivant() {
		return cheminSuivant;
	}

	public void setCheminSuivant(Chemin cheminSuivant) {
		this.cheminSuivant = cheminSuivant;
	}
	
	public String toString(){
		StringBuilder to = new StringBuilder();
		to.append(depart.toString()).append("->").append(arrive.toString()).append(" Heure ").append(moyen.getIdLigne()).append(" ").append(lhoraire.toString());
//		if(cheminSuivant != null) {
//			to.append(" \n").append(cheminSuivant.toString());
//		}
		return to.toString();
	}

	public boolean estPlusLourd(Chemin cheminEnCours) {
	//	return this.getLhoraire().getDate().after(cheminEnCours.getLhoraire().getDate());
		//TODO a faire encore
		return poid > cheminEnCours.getPoid();
	}

	public boolean estPlusLeger(Chemin cheminEnCours) {
		// TODO Auto-generated method stub
		//return cheminEnCours.getLhoraire().getDate().before(cheminEnCours.getLhoraire().getDate());
		return poid < cheminEnCours.getPoid();
	}

	
}
